( function ( D ) {
    // pour créer une zone d'autocomplétion
    // words : liste (tableau) des termes utilisés pour l'autocomplétion
    // input : élément DOM de type INPUT utilisé pour l'autocomplétion
    // onComplete : fonction callback appelée lorsqu'un élément est sélectionné
    D.autocomplete = function ( words, input, onComplete, domContainerId )
    {
        var domContainer;

        if( !onComplete )
        {
            onComplete = function ( )
            {
                return null;
            }
        }

        if(!domContainerId){
            domContainer = document.body;
        }else{
            domContainer = document.getElementById(domContainerId);
        }

        var autocomplete,
            choiceTaken = false;

        var updateAutocomplete = function ( )
        {
            var select = [];

            for( var i = 0 ; i < words.length ; i += 1 )
            {
                var word = words[ i ],
                    match = word.match( new RegExp( input.value ) );

                if( match )
                {
                    select.push( word );
                }
            }

            // lorsqu'est mise à jour la liste proposée pour l'autocomplétion,
            // on commence par supprimer tous les éléments de la liste courante
            var actualNumberOfChildren = autocomplete.childNodes.length;
    
            for( var i = 0 ; i < actualNumberOfChildren ; i += 1 ) 
            {
                autocomplete.removeChild( autocomplete.childNodes[ 0 ] );
            }

            var a;

            for( var i = 0 ; i < select.length ; i += 1 )
            {
                a = document.createElement( "a" );
                a.href = "";
                a.innerHTML = select[ i ];

                autocomplete.appendChild( a );

                a.onclick = function ( )
                {
                    input.value = this.innerHTML;
                    choiceTaken = true;
                    return false;
                }
            }

	    if(select.length === 0){
	    	
                a = document.createElement( "a" );
                a.href = "";
                a.innerHTML = input.value;

                autocomplete.appendChild( a );

                a.onclick = function ( )
                {
                    choiceTaken = true;
                    return false;
                }
	    }
        }

        input.onfocus = function ( )
        {
            autocomplete = document.createElement( "div" );

            autocomplete.setAttribute( "class", "autocomplete" );
            if(domContainerId){
                autocomplete.style.top = input.offsetHeight + $(input).position().top + "px";
                autocomplete.style.left = $(input).position().left + "px";
            }else{
                autocomplete.style.top = input.offsetHeight + $(input).offset().top + "px";
                autocomplete.style.left = $(input).offset().left + "px";
            }
            autocomplete.style.width = input.offsetWidth + "px";

            domContainer.appendChild( autocomplete );

            if( this.value === "" )
            {
                var a;

                for( var i = 0 ; i < words.length ; i += 1 )
                {
                    var word = words[ i ];

                    a = document.createElement( "a" );
                    a.href = "";
                    a.innerHTML = word;

                    autocomplete.appendChild( a );

                    a.onclick = function ( )
                    {
                        input.value = this.innerHTML;
                        choiceTaken = true;
                        return false;
                    }
                }

            }
            else
            {
                updateAutocomplete( );
            }
        }

        input.onkeyup = function ( e )
        {
            // Escape
            if( e.which === 27 )
            {
                this.value = "";
                this.blur( );
            }
            else
            // Return
            if( e.which === 13 )
            {
                if( autocomplete.firstChild )
                {
                    this.value = autocomplete.firstChild.innerHTML;
                }
                choiceTaken = true;
                this.blur( );
            }
            else
            {
                updateAutocomplete( );
            }
        }

        var removeAutocomplete = function ( )
        {
            domContainer.removeChild( autocomplete );
            if( choiceTaken )
            {
                choiceTaken = false;
                onComplete( input.value );
            }
            else
            {
                input.value = "";
            }
        }

        input.onblur = function ( e )
        {
            setTimeout( removeAutocomplete, 200 );
        }
    }
} ) ( DESANTI );
